ABI minor 8 — the register groupings served as data, not copied three times - #32
Conversation
…e times
The wire encoding of the §14 `carving` parameter lived in three places:
a Rust `match`, Java's `Carving` enum, and abi.md's own table. Each was
correct. Nothing would have failed if one had stopped agreeing with the
others — and the failure mode is silent: a grouping added or reordered
upstream re-maps one copy, a sweep then reads the same 12 bytes under the
wrong reading, and returns a plausible number.
One source, two derivations:
1. the contract owns the SET (CascadeShape::ROTATIONS);
2. kernels::CARVING_ORDER derives the ENCODING from it by a RULE
(group count, descending — never declaration position), as a const;
3. the manifest SERVES the result: carving_count + carvings[8], packed
(groups << 8) | group_bytes.
No new symbol. The manifest already exists so Java can discover the ABI's
shape rather than declare it, and a wire encoding is exactly such a shape.
Java keeps its ARITY and loses its ENCODING: RAILS_6X2 named anything but
6x2 would be a lie in its own name, so groups()/groupBytes() stay
declared, while wire()/ofWire() read the served table. The one literal
encoding left is CarvingTable.PRE_MINOR_8, whose name says it is history.
Also fixes a latent defect the change made reachable: Java's load gate
required the FULL manifest layout, so this — the first growth of the
manifest struct — would have made every older artifact fail to load, in
flat contradiction of §2's additive promise. The gate now requires only
the 104-byte base prefix; later fields are read when size_of_manifest
covers them AND the minor is high enough.
Gates: Rust 134 lib tests, fmt + clippy -D warnings clean; Java 304
checks (was 288); OldAbiCompatTest green against minors 1-4; no new javac
warnings.
Disable-runs, each red-then-green: swapped packed axes fail the serve
test; a reversed sort fails the order test and two others; a mismatched
Java arity fires BOTH membership directions; the restored full-layout
gate makes the minor-4 library fail to load outright.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DCfrD5y19cvFc4AoyydXYv
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_ab3dc661-16f8-43a9-877b-d5767284c903) |
PR_ARC_INVENTORY had entries for #1-#12, #14, #16, #18, #20 and #32, and nothing else. Missing: #13, #22-#31, #33-#41 — twenty PRs. (#15/#17/#19/#21 are also absent and correctly so: each is itself an arc-entry-only PR, exempt under the termination clause.) #32's own entry still read "(draft, opened …)" with no merge sha. Corrects this branch's first count, which said nineteen and read the gap as starting at #21. Both were wrong — it is twenty, and it starts at #13. The first count was a range subtraction over a file with holes; the enumeration is what found the difference. Method, which is the point rather than an aside: each entry drafted from that PR's own body and diff, five parallel agents over four PRs each, none permitted to work from a later session's recall. Every backfilled entry's Confidence bullet ends "Backfilled 2026-08-27 from the PR body and diff, not written at merge time", so reconstructed entries are distinguishable from ones written at merge time; several state which claims are the PR body's own and were not re-verified. Every cited sha, date and merge-vs- squash label machine-checked against git. Four things the backfill turned up, each recorded in the entry it belongs to: #25's body asserts "no code, no reproducer changes" and its own diff contradicts it; #39 left its lgj_hop doc comment describing the pre-change design; #34's banked evidence file did not identify its own JDK; and #41 is on main while its own title reads [DO NOT MERGE AS-IS], recorded as unresolved disposition rather than an endorsement. ISS-LGJ-ARC-INVENTORY-STOPPED-AT-32 moves to RESOLVED with the corrected count and the standing rule restated: the entry goes in at open, in the PR's own commit. The backfill is the repair, not the process. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DCfrD5y19cvFc4AoyydXYv
Stacked on #30 (minor 7). Base is
claude/layout-probe; retarget tomainonce #30 merges.The finding
The wire encoding of §14's
carvingparameter lived in three places — a Rustmatch, Java'sCarvingenum, andabi.md's own table. Each was correct. Nothing anywhere would have failed if one had stopped agreeing with the others.That is not a documentation problem. It is a correctness problem with no falsifier, and its failure mode is silent: a grouping added or reordered upstream re-maps one copy, a sweep then reads the same 12 bytes under the wrong grouping, and returns a plausible number.
The change
One source, two derivations:
CascadeShape::ROTATIONS;kernels::CARVING_ORDER(aconst) derives the ENCODING from it by a RULE — group count, descending, never declaration position;carving_count: u32+carvings: [u16; 8], packed(groups << 8) | group_bytes.No new symbol. The manifest already exists so Java can discover the ABI's shape instead of declaring it, and a wire encoding is exactly such a shape. It arrives on the read Java already performs at load.
A variant reorder upstream cannot re-map the wire. A variant added upstream propagates automatically and is caught in the build by the membership test rather than surfacing on someone's data.
CARVING_ORDERis aconstand not aLazyLockbecause the manifest that serves it is const-initialised.Meaning is declared; encoding is served
Carving.groups()/groupBytes()stay declared —RAILS_6X2named anything other than6 × 2would be a lie in its own name, and the arity IS the constant's identity. Onlywire()/ofWire()became lookups into the served table. The one literal encoding left in the build isCarvingTable.PRE_MINOR_8, whose name says it is history rather than the current answer.A latent defect this made reachable
Java's load gate required the full manifest layout. This is the first growth of the manifest struct, so it would have made every older artifact fail to load outright — in flat contradiction of §2's additive promise, and it would have taken
OldAbiCompatTest's whole premise with it.The gate now requires only the 104-byte base prefix (
Layouts.MANIFEST_BASE_BYTES). Later fields are read only when the library'ssize_of_manifestcovers them and its minor is high enough — both, because a manifest claiming a minor it is too short to carry is a broken artifact and reading it would produce plausible garbage.Gates
cargo fmt+clippy -D warningscleanAllTests, was 288 —CarvingTableTestadds 16)OldAbiCompatTest: green against all four historical.sos (minors 1–4)javac -Xlint:all: 10 warnings, unchanged baseline, none newDisable-runs — each verified red, then green
the_manifest_serves_exactly_the_derived_carving_orderFAILEDOwned mistake
Mid-session I ran
git checkoutonkernels.rsto undo a disable-run edit and destroyed the uncommitted work in that file. Reconstructed and re-verified (134 tests, same count). Disable-runs are now backed up to a file first and never reverted withgit checkout. Recorded in the board entry rather than quietly fixed.Still open, unchanged
FacetSchema's third reading is stillPair48rather than the operator-ruled L6 quads — flagged earlier, untouched here.Docs:
abi.md§17 (new), §2 (load-gate prefix + minor-8 history), §14's table regraded descriptive rather than normative, manifest struct listing, header constants. Board:LATEST_STATE.md,PR_ARC_INVENTORY.md,EPIPHANIES.md(E-LGJ-A-CONSTANT-COPIED-THREE-TIMES-HAS-NO-FALSIFIER-1) — all in the same commit.🤖 Generated with Claude Code
https://claude.ai/code/session_01DCfrD5y19cvFc4AoyydXYv
Generated by Claude Code